Megatron-Core Custom FSDP

Jianbin Chang, Hongbin Liu

目录

  1. 议程
  2. 全分片数据并行(FSDP)简介
    - FSDP 工作原理:ZeRO-DP 分片策略
    - FSDP 工作原理:FSDP 单元 (FSDP-Unit
    - FSDP 工作原理:AllGather
    - FSDP 工作原理:Reduce-Scatter
    - FSDP 工作原理:不同 ZeRO-DP 策略中的 AllGather (AG) 与 Reduce-Scatter (RS

  3. 自定义 FSDP - 关键特性
    - Megatron-Core 自定义 FSDP 关键特性架构图
    - 并行通信对 Gemm 的不利影响
    - 基于 UBR 的 SM 高效 NCCL 通信
    - 基于 UBR 的 SM 高效 NCCL 通信:AllGather 示例
    - NCCL 组调用 (Group Calls

  4. 理论分析:FSDP 中的通信隐藏
    - FSDP 中的计算与通信成本:Transformer 层前向传播
    - FSDP 中的计算与通信成本:Transformer 层后向传播
    - FSDP 中的计算与通信成本:MoE 层后向传播
    - FSDP 中的计算与通信成本:调优并行策略

  5. 基准测试与案例研究
    - 来自 BioNeMo 的自定义 FSDP 反馈
    - 基准测试:vs. FSDP2
    - 基准测试:vs. 3D 并行
    - FP8 训练中的挑战:CPU 瓶颈问题及 FSDP 解决方案
    - 案例研究:Llama3-70B + FSDP

  6. 最佳实践

  7. 如何在 Megatron-Core 中启用自定义 FSDP

议程

全分片数据并行(FSDP)简介

Page 3
Page 3

参考 PyTorch FSDP 介绍:https://pytorch.org/tutorials/intermediate/FSDP_tutorial.html

FSDP 工作原理:ZeRO-DP 分片策略

FSDP 的分片策略能够显著减少每个 GPU 的内存消耗,但更激进的分片会增加通信开销。

ZeRO-DP 分片策略对内存和通信的影响,Page 4
ZeRO-DP 分片策略对内存和通信的影响,Page 4

FSDP 工作原理:FSDP 单元 (FSDP-Unit)

FSDP 单元是我们用于取消分片/重新分片参数的操作单元,确保这些参数具有相同的计算生命周期。

FSDP 单元工作流程图,Page 5
FSDP 单元工作流程图,Page 5

FSDP 工作原理:AllGather

AllGather 过程示意图,Page 6
AllGather 过程示意图,Page 6

FSDP 工作原理:Reduce-Scatter

Reduce-Scatter 过程示意图,Page 7
Reduce-Scatter 过程示意图,Page 7

FSDP 工作原理:不同 ZeRO-DP 策略中的 AllGather (AG) 与 Reduce-Scatter (RS)

下图展示了在不同分片策略下,通信操作(AG 和 RS)与计算操作(前向 F、反向 B、优化器步骤 Opt step)的穿插执行方式。

不同 ZeRO-DP 策略下的通信时序图,Page 8
不同 ZeRO-DP 策略下的通信时序图,Page 8

自定义 FSDP - 关键特性

我们已经支持在 M-Core 上使用 Torch FSDP2。M-Core Custom FSDP 是一个轻量级、面向性能的 FSDP 实现。

下表比较了 Torch FSDP2 和我们的 Custom FSDP:

特性 FSDP2 (Torch) Custom FSDP
ZeRO-DP 等效性
可扩展性 ✅✅
性能 ✅✅
内存管理 ✅✅ (可选的双缓冲分配器)
CPU 卸载
通信定制 ✅ (可选的基于用户缓冲区注册的 NCCL 通信)
FP8 训练 ✅✅ (原生 FP8 支持;更好的转置缓存管理;NCCL 组调用)
M-Core MoE 训练兼容
FSDP2(Torch) 与 Custom FSDP 功能对比表,Page 10
FSDP2(Torch) 与 Custom FSDP 功能对比表,Page 10

Megatron-Core 自定义 FSDP 关键特性架构图

下图展示了 Custom FSDP 的核心组件及其交互关系。

Megatron-Core Custom FSDP 关键特性架构图,Page 11
Megatron-Core Custom FSDP 关键特性架构图,Page 11

并行通信对 Gemm 的不利影响

通信流处理器(SM)对 Gemm 性能的影响

当 Gemm(通用矩阵乘法)和 Comm(通信)操作并发运行时,它们必须共享资源(SM、DRAM、L2 缓存等),这会导致性能下降。

下图展示了 Gemm 性能在减少可用内存带宽(左)和减少 SM 数量(右)时的下降情况。

并行通信对 Gemm 性能影响的图表,Page 12
并行通信对 Gemm 性能影响的图表,Page 12

基于 UBR 的 SM 高效 NCCL 通信

利用 NVL Sharp、IB-Sharp 和 NCCL 实现高效集合通信

下图展示了在 256 个 GPU(8x32)上,不同 NCCL 算法在 All-Gather (AG) 和 Reduce-Scatter (RS) 操作中的带宽表现。新的 NVLS+IB/S 算法(黑色曲线)使用极少的 CTA(4个)即可达到高带宽。
*预计在 Megatron-Core v0.13 中发布。

基于 UBR 的 SM 高效 NCCL 通信性能图,Page 13
基于 UBR 的 SM 高效 NCCL 通信性能图,Page 13

基于 UBR 的 SM 高效 NCCL 通信:AllGather 示例

什么是 UBR?

目前,基于用户缓冲区注册(UBR)的 NCCL 通信只能由带有双缓冲内存分配器的 Custom FSDP 支持。

Torch 原生 AllGather 与 UBR-based AllGather 对比图,Page 14
Torch 原生 AllGather 与 UBR-based AllGather 对比图,Page 14

NCCL 组调用 (Group Calls)

用于加速多桶通信的 NCCL 组调用

示例:单个 FSDP 单元被拆分为三个通信组。

NCCL 组调用示例,Page 15
NCCL 组调用示例,Page 15

Page 16
上图对比了未使用(上)和使用(下)聚合 NCCL 通信的训练过程。在不使用聚合通信时,每个 FSDP 单元会为 FP8 和 BF16 的桶(bucket)分别触发大量独立的 NCCL 核心。使用聚合 NCCL 通信后,每个 FSDP 单元仅启动一个 NCCL 核心,显著减少了核心启动的开销,从而将通信操作融合,提高了效率。


理论分析:FSDP 中的通信隐藏

FSDP 中的计算与通信成本:Transformer 层前向传播

Page 18
Page 18

Page 19
Page 19

此页在上一页的分析基础上,增加了一个表格,展示了在不同张量并行(TP)规模下,为隐藏通信所需的最小微批次 token 数。


FSDP 中的计算与通信成本:Transformer 层后向传播

Page 20
Page 20

FSDP 中的计算与通信成本:MoE 层后向传播

Page 21
Page 21

FSDP 中的计算与通信成本:调优并行策略

Page 22
Page 22

本页总结了如何调整并行策略以更好地隐藏通信成本。


基准测试与案例研究

来自 BioNeMo 的自定义 FSDP 反馈

Page 24
Page 24

该基准测试在 2 个节点、16xH100 GPU 上进行。


基准测试:vs. FSDP2

Page 25
Page 25

此图展示了在 Megatron-Core 上训练 LLaMA3-70B 时,自定义 FSDP (C-FSDP) 与 FSDP2 的扩展效率对比。


基准测试:vs. 3D 并行

Page 26
Page 26

此图比较了自定义 FSDP (C-FSDP) 与 3D 并行在 H100 系统上的性能和内存使用情况。


FP8 训练中的挑战:CPU 瓶颈问题及 FSDP 解决方案

Page 27
Page 27
Page 28
Page 28

案例研究:Llama3-70B + FSDP

挑战:内存溢出(OOM)

Page 29
Page 29

解决方案 1:结合上下文并行(CP)

Page 30
Page 30
Page 31 展示了 Llama3-70B + FSDP 训练过程中的内存使用时间线。峰值激活内存超过50GB,而优化器状态占用约25GB。
Page 31 展示了 Llama3-70B + FSDP 训练过程中的内存使用时间线。峰值激活内存超过50GB,而优化器状态占用约25GB。

性能对比:上下文并行 vs. 激活重计算

本节通过表格和性能分析器视图,对比了采用上下文并行(CP)与采用激活重计算(Activation Recompute)两种方案的性能差异。

实验设置:
- 模型: Llama3-70b
- 计算精度: BF16
- GPU数量: 64
- 序列长度 (SEQ_LEN): 8194
- FSDP 并行度: 64
- 张量并行度 (TP): 1
- 流水线并行度 (PP): 1
- 微批次大小 (MBS): 1
- 全局批次大小 (GBS): 128

对比结果:
下表对比了三种不同配置下训练 Llama3-70B 的性能指标。

Page 32 的表格对比了三种不同配置下训练 Llama3-70B 的性能指标。
Page 32 的表格对比了三种不同配置下训练 Llama3-70B 的性能指标。
配置 激活完全重计算 内存使用 (GB) TFLOPS/GPU
CP=2 + 激活重计算 64.62 427
CP=8 (无重计算) 79.05 226
CP=4 (无重计算) 79.05 379

性能分析:
- 上图 (FSDP + CP4): 时间线显示计算(Kernel)和通信(蓝色条块)之间存在明显的空闲间隙。标注指出:“计算无法隐藏通信”,这意味着 GPU 在等待通信完成,导致计算单元闲置,降低了效率。
- 下图 (FSDP + 激活重计算): 计算流(Compute Stream)变得非常繁忙和密集。标注指出:“完全隐藏通信”和“繁忙的计算流”。这表明通过重计算引入的额外计算任务成功地与通信操作重叠,使得 GPU 能够持续执行计算任务,从而提高了整体的吞吐量。

Page 33 展示了两种方案的性能分析器时间线视图。
Page 33 展示了两种方案的性能分析器时间线视图。

结论:
在此场景下,激活重计算是最佳的映射方案。尽管激活重计算增加了约 1/3 的计算量,但通过更好地重叠计算和通信,获得了更高的整体性能,同时显著降低了内存使用。


最佳实践

本页总结了在训练大模型时的一些最佳实践建议。

实践领域 建议
计算与通信重叠 使用大的序列长度/微批次大小;调整通信桶(communication bucket)大小和 SM 分配。
激活内存优化 根据需要使用上下文并行(context parallelism)、激活卸载(activation offloading)或选择性激活重计算(selective activation recompute)。
权衡:内存节省 vs. 通信 仅在需要时启用重计算;调整重计算的粒度;优先考虑重叠以提高吞吐量。

如何在 Megatron-Core 中启用自定义 FSDP

本页提供了在 Megatron-Core 框架中启用和配置自定义 FSDP(Fully Sharded Data Parallelism)功能的具体指南。